package com.demo.alg.chapter15动态规划.背包问题;

/**https://www.cnblogs.com/lfeng1205/p/5981198.html
 * 在N件物品取出若干件放在容量为W的背包里，每件物品的体积为W1，W2……Wn（Wi为整数），与之相对应的价值为P1,P2……Pn（Pi为整数）。求背包能够容纳的最大价值。
 *
 * 先将原始问题一般化，欲求背包能够获得的总价值，即欲求前i个物体放入容量为m（kg）背包的最大价值c[i][m]——使用一个数组来存储最大价值，当m取10，i取3时，即原始问题了。而前i个物体放入容量为m（kg）的背包，又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。

　　表达式中各个符号的具体含义。

　　w[i] :  第i个物体的重量；

　　p[i] : 第i个物体的价值；

　　c[i][m] ： 前i个物体放入容量为m的背包的最大价值；

　　c[i-1][m] ： 前i-1个物体放入容量为m的背包的最大价值；

　　c[i-1][m-w[i]] ： 前i-1个物体放入容量为m-w[i]的背包的最大价值；

	由此可得：c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}，更具体的解释：
	不放入第i个物品，即c[i][m]=c[i-1][m]
	放入第i个物品，即c[i][m]=c[i-1][m-w[i]]+p[i]
 *
 */
public class Dp04 {

	public static void main(String[] args) {
        int n = 4; //物品个数
        int v = 8; //容量
        int[] dp = new int[v+1];
        int[] price = new int[]{0, 3, 4, 5, 6};
        int[] weight = new int[]{0, 2, 3, 4, 5};
        long max = 0;
        for(int i=1; i<n+1; i++){
            for(int j=v; j>0; j--){
                if(j - weight[i] >= 0){
                    dp[j] = Math.max(dp[j], dp[j-weight[i]] + price[i]);
                }
            }
            for(int z=0; z<dp.length; z++){
            	System.out.print(dp[z] + "\t");
            }
            System.out.println();
        }
        for(int i=0; i<v+1; i++){
            max = max > dp[i] ? max : dp[i];
        }
        System.out.println(max);
    }

}
